import config from "@/config";
import axios from "axios";
import { ElMessage } from "element-plus";

const service = axios.create({
  baseURL: config.baseApi,
});
const NETWORK_ERROR = "网络错误，请稍后再试";
// 添加请求拦截器
service.interceptors.request.use(
  function (config) {
    // 在发送请求之前做些什么
    return config;
  },
  function (error) {
    // 对请求错误做些什么
    return Promise.reject(error);
  }
);

// 添加响应拦截器
service.interceptors.response.use((res) => {
  const { code, data, msg } = res.data;
  if (code === 200) {
    return data;
  } else {
    ElMessage.error(msg || NETWORK_ERROR);
    return Promise.reject(msg || NETWORK_ERROR);
  }
});

/**
 * 发起HTTP请求
 * @param {Object} options - 请求配置对象
 * @param {string} options.methods - HTTP请求方法（如GET/POST等）
 * @param {Object} options.data - 请求数据（用于POST等请求）
 * @param {Object} options.params - URL参数（用于GET请求）
 * @param {boolean} [options.mock] - 可选标记是否使用Mock服务器
 * @returns {Promise} 返回axios服务调用的Promise对象
 */
function request(options: any) {
  // 设置默认请求方法：如果未指定则默认使用GET方法
  options.method = options.method || "get";

  // 如果请求方法是GET，将请求数据(data)移到参数(params)中
  // 因为GET请求应该使用URL参数而非请求体
  if (options.method.toLowerCase() === "get") {
    options.params = options.data || options.params;
    if (options.data) {
      delete options.data;
    }
  } else {
    // POST/PUT等请求：将数据放在data中
    // 优先使用data，如果没有则使用params（但不删除params）
    if (!options.data && options.params) {
      options.data = options.params;
      // 对于非GET请求，删除params以避免数据重复
      delete options.params;
    }
  }

  // 默认使用全局配置的mock设置
  let isMock = config.mock;

  // 检查请求选项中是否有特定的mock设置
  // 如果提供了选项级别的mock配置，则覆盖全局设置
  if (typeof options.mock !== "undefined") {
    isMock = options.mock;
  }

  // 根据当前环境决定请求的基础URL
  if (config.env === "prod") {
    service.defaults.baseURL = config.baseApi;
  } else {
    service.defaults.baseURL = isMock ? config.mockApi : config.baseApi;
  }

  console.log('请求配置:', {
    url: options.url,
    method: options.method,
    params: options.params,
    data: options.data,
    baseURL: service.defaults.baseURL
  });
  // 调用底层HTTP服务（如axios）执行配置好的请求
  return service(options);
}

export default request;